 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "init.h"



int indice(champs c, int i, int j ){
	int n = c->nb_colonnes ;
	return n * i + j ;
}

int getX(champs c ,int k ){
	return k/c->nb_lignes ;
}

int getY(champs c ,int k){
	return  k % c->nb_colonnes ;
}

champs init(int nb_lignes, int nb_colonnes, int nb_mines){
	int i , j ;
	champs grille = (champs) malloc(sizeof(str_champs)) ; 
	srand((unsigned int)  time (NULL)); /*pour initialiser rand()*/
	
	//============== INITIALISATION D UNE STRUCTURE GRILLE ==========
	
	grille->nb_colonnes = nb_colonnes ;
	grille->nb_lignes = nb_lignes ;
	grille->tab = (parcelle*) malloc(nb_lignes*nb_colonnes*sizeof(parcelle));
	
	 	/*Initialisation de toutes les parcelles a 0 mine et vierges */
	for(i = 0 ; i < grille->nb_lignes; i++ )
		for(j = 0 ; j < grille-> nb_colonnes ;j++){
			grille->tab[indice(grille,i,j)].mine = 0 ;
			grille->tab[indice(grille,i,j)].status = PASVU ;
		}
	
	 /*Repartition aleatoire des mines */
	while(nb_mines>0){
		i = rand()%(nb_lignes);
		j = rand()%(nb_colonnes);		 
		if(grille->tab[indice(grille,i,j)].mine ==0){ //on verifie si la case ne contien pas de mine
		 grille->tab[indice(grille,i,j)].mine = 1 ;
		 nb_mines--;
 	}
	}
	
	return grille ;
	
}

int nb_mines_voisins(champs c, int i, int j){
		
		int nbre_mine=0;
		int nb_lignes = c->nb_lignes ;
		int nb_colonnes = c->nb_colonnes ;		
		//=================GESTION DES CONTOURS ==========================
		
		/* On definie des booleens pour nous dire si une case quelconque 
			possede des voisins 
		 */
		int nord = (i-1 >=0)   , nord_est = (i-1>=0&&j+1<nb_colonnes) , 
		est = (j+1<nb_colonnes) , sud_est = (i+1<nb_lignes && j+1 < nb_colonnes) ,
		sud = (i+1<nb_lignes) , sud_ouest = (i+1<nb_lignes && j-1>=0 )  , ouest = (j-1>=0) ,
		nord_ouest = (i-1>=0&&j-1>=0) ;
       /*Pour chaque case on verifie s il possede un voisin dans les 8 directions */
		if(nord && c->tab[indice(c,i-1,j)].mine ==1)
			nbre_mine++ ;
		if(nord_est && c->tab[indice(c,i-1,j+1)].mine ==1 )
			nbre_mine++ ;
		if(est && c->tab[indice(c,i,j+1)].mine ==1)
			nbre_mine++ ;
		if(sud_est && c->tab[indice(c,i+1,j+1)].mine ==1 )
			nbre_mine++ ;
		if(sud && c->tab[indice(c,i+1,j)].mine ==1)
			nbre_mine++ ;
		if(ouest && c->tab[indice(c,i,j-1)].mine ==1)
			nbre_mine++;
		if(nord_ouest && c->tab[indice(c,i-1,j-1)].mine ==1 )
			nbre_mine++;
		if(sud_ouest && c->tab[indice(c,i+1,j-1)].mine ==1 )
			nbre_mine++;
		return nbre_mine;
}


